#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

/*
 * Class:     com_yf_cfork_MainActivity
 * Method:    cfork
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_yf_cfork_MainActivity_cfork(JNIEnv* env,
		jobject thiz) {
	// fork函数可以在java进程中分叉出一个c子进程（父进程是java进程）
	// 如果成功，返回值是c子进程是编号，且分叉出的c子进程与父java进程拥有相同的资源，执行相同的代码。
	// 但是在子进程中再次执行fork并不会再次分叉出子进程，返回值为0
	int pid = fork();
	if (pid > 0) {
		LOGD("PID = %d", pid);
	} else if (pid == 0) {
		LOGD("PID = 0");
		int ppid = getppid();
		FILE* file = NULL;
		while (1) {
			sleep(3);
			LOGD("sub process is running");
			if (ppid == 1) {
				file = fopen("data/data/com.yf.cfork", "r");
				if (file == NULL) {
					//应用被卸载,弹出浏览器
					execlp("am", "am", "start", "--user", "0", "-a",
							"android.intent.action.VIEW", "-d",
							"https://www.baidu.com", (char *) NULL);
				} else {
					//应用进程被杀死,开启应用
					execlp("am", "am", "start", "--user", "0", "-n",
							"com.yf.cfork/com.yf.cfork.MainActivity",
							(char *) NULL);
				}
			}
		}
	} else {
		LOGD("fork fail");
	}
}

